package hotel.interceptor;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jboss.logging.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import hotel.entity.User;

/**
 * 权限控制拦截器
 * 对所有的请求进行拦截,除了login.jsp
 * Spring框架中实现HandlerInterceptor或者WebRequestInterceptor接口实现拦截器
 * 本次设计使用HandlerInterceptor
 * 拦截器还需要在配置文件中配置springmvc.xml
 * @author 15信管四班第六组
 *
 */
public class AuthorityInterceptor implements HandlerInterceptor {

	//日志记录
	private static Logger log=Logger.getLogger(AuthorityInterceptor.class);
	
	/**
	 * 本方法在视图渲染之后执行，主要用于释放资源
	 * 本次设计不需要作特别处理，空方法
	 */
	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		
	}

	/**
	 * 本方法在完成Controller处理之后，渲染视图之前执行
	 * 因为不需要进行特别的处理，保持空方法
	 */
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		
	}

	/**
	 * 本方法在Controller方法之前执行
	 * 返回true继续执行下一个配置的拦截器或者Controller方法，返回false不继续向下执行
	 * 权限控制主要在这里实现
	 * login,logout等已在配置文件中过滤
	 */
	@SuppressWarnings("unchecked")
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) 
			throws Exception {
		log.info("IP地址: "+request.getRemoteAddr()+"  请求URL: "
			+request.getRequestURI()+"?"+request.getQueryString());	
		//未登录,重定向到登录页面
		User loginUser=(User)request.getSession().getAttribute("loginUser");
		if(loginUser==null) {
			response.sendRedirect("login");
			return false;
		}else if(loginUser.getAccount().equals("admin")) {
			//admin账号不进行权限校验
			return true;
		}
		
		//已登录,校验权限
		Map<String,String> authsMap=(HashMap<String,String>)request.getSession().getAttribute("loginUser_authority");
		//requestURI:/QuickHotel/XXX
		String str=request.getRequestURI().substring(12);
		if(authsMap!=null&&authsMap.containsKey(str)) {//如果有权限
			return true;
		}
		else {
			request.getRequestDispatcher("/noRight.jsp").forward(request, response);
			return false;
		}
	}

}
